/*
 * TDS PEC 4
 * Grupo 3H2M
 *
 * El paquete <code>edu.uoc.tds.pec4.server.impl</code> agrupa todas las clases
 * que encapsulan la implementación de los métodos de acceso RMI y el servidor.
 */
package edu.uoc.tds.pec4.server.impl;

import edu.uoc.tds.pec4.beans.AuditoriaDTO;
import edu.uoc.tds.pec4.beans.AulaDTO;
import edu.uoc.tds.pec4.beans.CFisicaDTO;
import edu.uoc.tds.pec4.beans.EquipamientoDTO;
import edu.uoc.tds.pec4.beans.RolDTO;
import edu.uoc.tds.pec4.beans.UsuarioDTO;
import edu.uoc.tds.pec4.common.util.Constantes;
import edu.uoc.tds.pec4.rmi.GestorMantenimientoInterface;
import edu.uoc.tds.pec4.server.bbdd.DAOFactory;
import edu.uoc.tds.pec4.server.bbdd.IAuditoriaDAO;
import edu.uoc.tds.pec4.server.bbdd.IAulaDAO;
import edu.uoc.tds.pec4.server.bbdd.IEquipamientoDAO;
import edu.uoc.tds.pec4.server.bbdd.IUsuarioDAO;
import edu.uoc.tds.pec4.server.bbdd.exceptions.DAOFactoryException;
import edu.uoc.tds.pec4.server.bbdd.exceptions.DataBaseDAOException;
import edu.uoc.tds.pec4.server.bbdd.exceptions.GestorMantenimientoException;
import java.rmi.RemoteException;
import java.rmi.server.UnicastRemoteObject;
import java.util.ArrayList;
import java.util.List;

/**
 * La clase <code>GestorMantenimientoImpl</code> contiene la implementación de
 * todos los  métodos indicados en la interfaz <code>GestorMantenimientoInterface</code><br />
 * Clase que implementa todas las funciones remotas que se pueden solicitar por RMI
 * y que tienen que ver con el subsistema de Mantenimiento. <br />
 *
 * Representa el objeto remoto que se invoca en la comunicación RMI para los 
 * servicios del subsistema de Mantenimiento
 *
 * @author	Luis Rivas Mariño
 * @version	03/12/2011
 * @see		edu.uoc.tds.pec4.common.GestorMantenimientoInterface
 */
public class GestorMantenimientoImpl extends UnicastRemoteObject implements GestorMantenimientoInterface {

    /**
     * Constructor
     * @throws	RemoteException en caso de producirse un fallo de comunicaciones
     */
    public GestorMantenimientoImpl() throws RemoteException {
        super();
    }

    /**
     * Realiza el alta de un usuario en la base de datos.
     * @param usuario El usuario a dar de alta en la base de datos
     * @throws RemoteException
     * @throws GestorMantenimientoException
     */
    @Override
    public void altaUsuario(UsuarioDTO usuario) throws RemoteException, GestorMantenimientoException {

        try {
            DAOFactory factory = DAOFactory.getDAOFactory();
            IUsuarioDAO dao = factory.getUsuarioDAO();
            dao.altaUsuario(usuario);

            // Liberamos recursos
            factory = null;
            dao = null;

        } catch (DAOFactoryException daoFe) {
            throw new GestorMantenimientoException(GestorMantenimientoException.ERROR_ALTA_USUARIO
                    + Constantes.SL + daoFe.getMessage());
        } catch (DataBaseDAOException daoE) {
            throw new GestorMantenimientoException(GestorMantenimientoException.ERROR_ALTA_USUARIO
                    + Constantes.SL + daoE.getMessage());
        }
    }

    /**
     * Realiza la baja lógica de un usuario en la base de datos.
     * @param idUsuario El identificador del usuario a dar de baja
     * @throws RemoteException
     * @throws GestorMantenimientoException
     */
    @Override
    public void bajaUsuario(String idUsuario) throws RemoteException, GestorMantenimientoException {

        try {
            DAOFactory factory = DAOFactory.getDAOFactory();
            IUsuarioDAO dao = factory.getUsuarioDAO();
            dao.bajaUsuario(idUsuario);

            // Liberamos recursos
            factory = null;
            dao = null;

        } catch (DAOFactoryException daoFe) {
            throw new GestorMantenimientoException(GestorMantenimientoException.ERROR_BAJA_USUARIO
                    + Constantes.SL + daoFe.getMessage());
        } catch (DataBaseDAOException daoE) {
            throw new GestorMantenimientoException(GestorMantenimientoException.ERROR_BAJA_USUARIO
                    + Constantes.SL + daoE.getMessage());
        }
    }

    /**
     * Realiza la reactivación de un usuario que estaba en baja lógica
     * @param idUsuario El identificador del usuario a reactivar
     * @throws RemoteException
     * @throws GestorMantenimientoException 
     */
    @Override
    public void activaUsuario(String idUsuario) throws RemoteException, GestorMantenimientoException {

        try {
            DAOFactory factory = DAOFactory.getDAOFactory();
            IUsuarioDAO dao = factory.getUsuarioDAO();
            dao.activaUsuario(idUsuario);

            // Liberamos recursos
            factory = null;
            dao = null;

        } catch (DAOFactoryException daoFe) {
            throw new GestorMantenimientoException(GestorMantenimientoException.ERROR_BAJA_USUARIO
                    + Constantes.SL + daoFe.getMessage());
        } catch (DataBaseDAOException daoE) {
            throw new GestorMantenimientoException(GestorMantenimientoException.ERROR_BAJA_USUARIO
                    + Constantes.SL + daoE.getMessage());
        }
    }

    /**
     * Realiza la consulta de un usuario en la base de datos.
     * @param idUsuario El identificador del usuario a consultar
     * @throws RemoteException
     * @throws GestorMantenimientoException
     */
    @Override
    public UsuarioDTO consultaUsuarioPorId(String idUsuario) throws RemoteException, GestorMantenimientoException {

        UsuarioDTO usuario = new UsuarioDTO();

        try {
            DAOFactory factory = DAOFactory.getDAOFactory();
            IUsuarioDAO dao = factory.getUsuarioDAO();
            usuario = dao.consultaUsuarioPorId(idUsuario);

            // Liberamos recursos
            factory = null;
            dao = null;

        } catch (DAOFactoryException daoFe) {
            throw new GestorMantenimientoException(GestorMantenimientoException.ERROR_CONSULTA_USUARIO
                    + Constantes.SL + daoFe.getMessage());
        } catch (DataBaseDAOException daoE) {
            throw new GestorMantenimientoException(GestorMantenimientoException.ERROR_CONSULTA_USUARIO
                    + Constantes.SL + daoE.getMessage());
        }
        return usuario;
    }

    /**
     * Realiza la modificación de un usuario en la base de datos.
     * @param usuario El usuario a modificar
     * @throws RemoteException
     * @throws GestorMantenimientoException
     */
    @Override
    public void modificaUsuario(UsuarioDTO usuario) throws RemoteException, GestorMantenimientoException {

        try {
            DAOFactory factory = DAOFactory.getDAOFactory();
            IUsuarioDAO dao = factory.getUsuarioDAO();
            dao.modificaUsuario(usuario);

            // Liberamos recursos
            factory = null;
            dao = null;

        } catch (DAOFactoryException daoFe) {
            throw new GestorMantenimientoException(GestorMantenimientoException.ERROR_MODIFICA_USUARIO
                    + Constantes.SL + daoFe.getMessage());
        } catch (DataBaseDAOException daoE) {
            throw new GestorMantenimientoException(GestorMantenimientoException.ERROR_MODIFICA_USUARIO
                    + Constantes.SL + daoE.getMessage());
        }
    }

    /**
     * Obtiene una lista de todos los roles autorizados a un usuario 
     * @throws RemoteException
     * @throws GestorMantenimientoException 
     */
    @Override
    public List<RolDTO> getRoles(String id) throws RemoteException, GestorMantenimientoException {

        List<RolDTO> roles = new ArrayList<RolDTO>();

        try {
            DAOFactory factory = DAOFactory.getDAOFactory();
            IUsuarioDAO dao = factory.getUsuarioDAO();
            roles = dao.getRoles(id);

            // Liberación de recursos
            factory = null;
            dao = null;

        } catch (DAOFactoryException daoFe) {
            throw new GestorMantenimientoException(GestorMantenimientoException.ERROR_LISTA_EQUIPAMIENTO
                    + Constantes.SL + daoFe.getMessage());
        } catch (DataBaseDAOException daoE) {
            throw new GestorMantenimientoException(GestorMantenimientoException.ERROR_LISTA_EQUIPAMIENTO
                    + Constantes.SL + daoE.getMessage());
        }

        return roles;
    }

    /**
     * Comprueba si un usuario tiene asignado un rol concreto
     * @param idUsuario El identificador del usuario
     * @param idRol El identificador del rol asignado
     * @return true  El usuario tiene asignado el rol
     *         false El usuario no tiene asignado el rol
     */
    public boolean rolUsuario(String idUsuario, int idRol) throws RemoteException, GestorMantenimientoException {
        boolean rolAsignado = false;
        try {
            DAOFactory factory = DAOFactory.getDAOFactory();
            IUsuarioDAO dao = factory.getUsuarioDAO();
            rolAsignado = dao.rolUsuario(idUsuario, idRol);

            // Liberación de recursos
            factory = null;
            dao = null;
        } catch (DAOFactoryException daoFe) {
            throw new GestorMantenimientoException(GestorMantenimientoException.ERROR_LISTA_EQUIPAMIENTO
                    + Constantes.SL + daoFe.getMessage());
        } catch (DataBaseDAOException daoE) {
            throw new GestorMantenimientoException(GestorMantenimientoException.ERROR_LISTA_EQUIPAMIENTO
                    + Constantes.SL + daoE.getMessage());
        }

        return rolAsignado;
    }

    /**
     * Realiza el alta de un aula en la base de datos.
     * @param aula El aula a dar de alta en la base de datos
     * @throws RemoteException
     * @throws GestorMantenimientoException
     */
    @Override
    public int altaAula(AulaDTO aula) throws RemoteException, GestorMantenimientoException {

        int idAula = 0;

        try {
            DAOFactory factory = DAOFactory.getDAOFactory();
            IAulaDAO dao = factory.getAulaDAO();
            idAula=dao.altaAula(aula);

            // Liberamos recursos
            factory = null;
            dao = null;

        } catch (DAOFactoryException daoFe) {
            throw new GestorMantenimientoException(GestorMantenimientoException.ERROR_ALTA_AULA
                    + Constantes.SL + daoFe.getMessage());
        } catch (DataBaseDAOException daoE) {
            throw new GestorMantenimientoException(GestorMantenimientoException.ERROR_ALTA_AULA
                    + Constantes.SL + daoE.getMessage());
        }
        return idAula;
    }

    /**
     * Realiza la baja lógica de un aula en la base de datos.
     * @param idAula El identificador del aula a dar de baja
     * @throws RemoteException
     * @throws GestorMantenimientoException
     */
    @Override
    public void bajaAula(int idAula) throws RemoteException, GestorMantenimientoException {

        try {
            DAOFactory factory = DAOFactory.getDAOFactory();
            IAulaDAO dao = factory.getAulaDAO();
            dao.bajaAula(idAula);

            // Liberamos recursos
            factory = null;
            dao = null;

        } catch (DAOFactoryException daoFe) {
            throw new GestorMantenimientoException(GestorMantenimientoException.ERROR_ALTA_AULA
                    + Constantes.SL + daoFe.getMessage());
        } catch (DataBaseDAOException daoE) {
            throw new GestorMantenimientoException(GestorMantenimientoException.ERROR_ALTA_AULA
                    + Constantes.SL + daoE.getMessage());
        }
    }

    /**
     * Realiza la consulta de los datos de un aula en la base de datos
     * @param idAula El identificador del aula a consultar
     * @throws RemoteException
     * @throws GestorMantenimientoException
     */
    @Override
    public AulaDTO consultaAula(int idAula) throws RemoteException, GestorMantenimientoException {

        AulaDTO aula = new AulaDTO();

        try {
            DAOFactory factory = DAOFactory.getDAOFactory();
            IAulaDAO dao = factory.getAulaDAO();
            aula = dao.consultaAula(idAula);

            // Liberamos recursos
            factory = null;
            dao = null;

        } catch (DAOFactoryException daoFe) {
            throw new GestorMantenimientoException(GestorMantenimientoException.ERROR_ALTA_AULA
                    + Constantes.SL + daoFe.getMessage());
        } catch (DataBaseDAOException daoE) {
            throw new GestorMantenimientoException(GestorMantenimientoException.ERROR_ALTA_AULA
                    + Constantes.SL + daoE.getMessage());
        }

        return aula;
    }

    /**
     * Realiza la consulta de los datos de un aula en la base de datos a partir de su nombre
     * @param nombre El nombre del aula a consultar
     * @throws RemoteException
     * @throws GestorMantenimientoException
     */
    @Override
    public AulaDTO consultaAulaNombre(String nombre) throws RemoteException, GestorMantenimientoException {
        AulaDTO aula = new AulaDTO();

        try {
            DAOFactory factory = DAOFactory.getDAOFactory();
            IAulaDAO dao = factory.getAulaDAO();
            aula = dao.consultaAulaNombre(nombre);

            // Liberamos recursos
            factory = null;
            dao = null;

        } catch (DAOFactoryException daoFe) {
            throw new GestorMantenimientoException(GestorMantenimientoException.ERROR_ALTA_AULA
                    + Constantes.SL + daoFe.getMessage());
        } catch (DataBaseDAOException daoE) {
            throw new GestorMantenimientoException(GestorMantenimientoException.ERROR_ALTA_AULA
                    + Constantes.SL + daoE.getMessage());
        }

        return aula;
    }

    /**
     * Realiza la modificación de un aula en la base de datos
     * @param aula El aula a modificar
     * @throws RemoteException
     * @throws GestorMantenimientoException
     */
    @Override
    public void modificaAula(AulaDTO aula) throws RemoteException, GestorMantenimientoException {

        try {
            DAOFactory factory = DAOFactory.getDAOFactory();
            IAulaDAO dao = factory.getAulaDAO();
            dao.modificaAula(aula);

            // Liberamos recursos
            factory = null;
            dao = null;

        } catch (DAOFactoryException daoFe) {
            throw new GestorMantenimientoException(GestorMantenimientoException.ERROR_ALTA_AULA
                    + Constantes.SL + daoFe.getMessage());
        } catch (DataBaseDAOException daoE) {
            throw new GestorMantenimientoException(GestorMantenimientoException.ERROR_ALTA_AULA
                    + Constantes.SL + daoE.getMessage());
        }
    }

    /**
     * Realiza la activación de un aula que estaba en baja lógica
     * @param idAula El identificador del aula a activar
     * @throws RemoteException
     * @throws GestorMantenimientoException 
     */
    @Override
    public void activaAula(int idAula)  throws RemoteException, GestorMantenimientoException {
         try {
            DAOFactory factory = DAOFactory.getDAOFactory();
            IAulaDAO dao = factory.getAulaDAO();
            dao.activaAula(idAula);

            // Liberación de recursos
            factory = null;
            dao = null;

        } catch (DAOFactoryException daoFe) {
            throw new GestorMantenimientoException(GestorMantenimientoException.ERROR_ALTALOGICA_AULA
                    + Constantes.SL + daoFe.getMessage());
        } catch (DataBaseDAOException daoE) {
            throw new GestorMantenimientoException(GestorMantenimientoException.ERROR_ALTALOGICA_AULA
                    + Constantes.SL + daoE.getMessage());
        }
    }    
    
    /**
     * Realiza el alta de un equipamiento
     * @param equipamiento El equipamiento a dar de alta
     * @throws RemoteException
     * @throws GestorMantenimientoException 
     */
    @Override
    public int altaEquipamiento(EquipamientoDTO equipamiento) throws RemoteException, GestorMantenimientoException {

        int id;

        try {
            DAOFactory factory = DAOFactory.getDAOFactory();
            IEquipamientoDAO dao = factory.getEquipamientoDAO();
            id = dao.altaEquipamiento(equipamiento);

            // Liberamos recursos
            factory = null;
            dao = null;

        } catch (DAOFactoryException daoFe) {
            throw new GestorMantenimientoException(GestorMantenimientoException.ERROR_ALTA_EQUIPAMIENTO
                    + Constantes.SL + daoFe.getMessage());
        } catch (DataBaseDAOException daoE) {
            throw new GestorMantenimientoException(GestorMantenimientoException.ERROR_ALTA_EQUIPAMIENTO
                    + Constantes.SL + daoE.getMessage());
        }

        return id;
    }

    /**
     * Realiza la baja de un equipamiento
     * @param idEquipamiento El identificador del equipamiento a dar de baja
     * @throws RemoteException
     * @throws GestorMantenimientoException 
     */
    @Override
    public void bajaEquipamiento(int idEquipamiento) throws RemoteException, GestorMantenimientoException {

        try {
            DAOFactory factory = DAOFactory.getDAOFactory();
            IEquipamientoDAO dao = factory.getEquipamientoDAO();
            dao.bajaEquipamiento(idEquipamiento);

            // Liberación de recursos
            factory = null;
            dao = null;

        } catch (DAOFactoryException daoFe) {
            throw new GestorMantenimientoException(GestorMantenimientoException.ERROR_BAJA_EQUIPAMIENTO
                    + Constantes.SL + daoFe.getMessage());
        } catch (DataBaseDAOException daoE) {
            throw new GestorMantenimientoException(GestorMantenimientoException.ERROR_BAJA_EQUIPAMIENTO
                    + Constantes.SL + daoE.getMessage());
        }
    }

    /**
     * Realiza la activación de un equipamiento que estaba en baja lógica
     * @param idEquipamiento El identificador del equipamiento a activar
     * @throws RemoteException
     * @throws GestorMantenimientoException 
     */
    @Override
    public void activaEquipamiento(int idEquipamiento) throws RemoteException, GestorMantenimientoException {

        try {
            DAOFactory factory = DAOFactory.getDAOFactory();
            IEquipamientoDAO dao = factory.getEquipamientoDAO();
            dao.activaEquipamiento(idEquipamiento);

            // Liberación de recursos
            factory = null;
            dao = null;

        } catch (DAOFactoryException daoFe) {
            throw new GestorMantenimientoException(GestorMantenimientoException.ERROR_ALTALOGICA_EQUIPAMIENTO
                    + Constantes.SL + daoFe.getMessage());
        } catch (DataBaseDAOException daoE) {
            throw new GestorMantenimientoException(GestorMantenimientoException.ERROR_ALTALOGICA_EQUIPAMIENTO
                    + Constantes.SL + daoE.getMessage());
        }
    }

    /**
     * Realiza la consulta de los datos de un equipamiento
     * @param idEquipamiento El identificador del equipamiento a dar de baja
     * @throws RemoteException
     * @throws GestorMantenimientoException 
     */
    @Override
    public EquipamientoDTO consultaEquipamiento(int idEquipamiento) throws RemoteException, GestorMantenimientoException {

        EquipamientoDTO equipamiento = null;

        try {
            DAOFactory factory = DAOFactory.getDAOFactory();
            IEquipamientoDAO dao = factory.getEquipamientoDAO();
            equipamiento = dao.consultaEquipamiento(idEquipamiento);

            // Liberación de recursos
            factory = null;
            dao = null;

        } catch (DAOFactoryException daoFe) {
            throw new GestorMantenimientoException(GestorMantenimientoException.ERROR_CONSULTA_EQUIPAMIENTO
                    + Constantes.SL + daoFe.getMessage());
        } catch (DataBaseDAOException daoE) {
            throw new GestorMantenimientoException(GestorMantenimientoException.ERROR_CONSULTA_EQUIPAMIENTO
                    + Constantes.SL + daoE.getMessage());
        }

        return equipamiento;

    }

    /**
     * Realiza la modificación de un equipamiento
     * @param equipamiento El equipamiento a modificar
     * @throws RemoteException
     * @throws GestorMantenimientoException 
     */
    @Override
    public void modificaEquipamiento(EquipamientoDTO equipamiento) throws RemoteException, GestorMantenimientoException {

        try {
            DAOFactory factory = DAOFactory.getDAOFactory();
            IEquipamientoDAO dao = factory.getEquipamientoDAO();
            dao.modificaEquipamiento(equipamiento);

            // Liberación de recursos
            factory = null;
            dao = null;

        } catch (DAOFactoryException daoFe) {
            throw new GestorMantenimientoException(GestorMantenimientoException.ERROR_MODIFICA_EQUIPAMIENTO
                    + Constantes.SL + daoFe.getMessage());
        } catch (DataBaseDAOException daoE) {
            throw new GestorMantenimientoException(GestorMantenimientoException.ERROR_MODIFICA_EQUIPAMIENTO
                    + Constantes.SL + daoE.getMessage());
        }
    }

    /**
     * Obtiene una lista de todos los equipamientos en alta existentes 
     * en la base de datos
     * @throws RemoteException
     * @throws GestorMantenimientoException 
     */
    @Override
    public List<EquipamientoDTO> listaEquipamiento() throws RemoteException, GestorMantenimientoException {

        List<EquipamientoDTO> equipamientos = new ArrayList<EquipamientoDTO>();

        try {
            DAOFactory factory = DAOFactory.getDAOFactory();
            IEquipamientoDAO dao = factory.getEquipamientoDAO();
            equipamientos = dao.listaEquipamiento();

            // Liberación de recursos
            factory = null;
            dao = null;

        } catch (DAOFactoryException daoFe) {
            throw new GestorMantenimientoException(GestorMantenimientoException.ERROR_LISTA_EQUIPAMIENTO
                    + Constantes.SL + daoFe.getMessage());
        } catch (DataBaseDAOException daoE) {
            throw new GestorMantenimientoException(GestorMantenimientoException.ERROR_LISTA_EQUIPAMIENTO
                    + Constantes.SL + daoE.getMessage());
        }

        return equipamientos;
    }

    /**
     * Realiza el alta de la información de auditoría de un movimiento realizado
     * en una de las tablas auditables de la base de datos
     * @param auditoria Los datos de auditoria del movimiento
     * @throws RemoteException
     * @throws GestorMantenimientoException 
     */
    @Override
    public void altaAuditoria(AuditoriaDTO auditoria) throws RemoteException, GestorMantenimientoException {

        try {
            DAOFactory factory = DAOFactory.getDAOFactory();
            IAuditoriaDAO dao = factory.getAuditoriaDAO();
            dao.altaAuditoria(auditoria);

            // Liberamos recursos
            factory = null;
            dao = null;

        } catch (DAOFactoryException daoFe) {
            throw new GestorMantenimientoException(GestorMantenimientoException.ERROR_ALTA_EQUIPAMIENTO
                    + Constantes.SL + daoFe.getMessage());
        } catch (DataBaseDAOException daoE) {
            throw new GestorMantenimientoException(GestorMantenimientoException.ERROR_ALTA_EQUIPAMIENTO
                    + Constantes.SL + daoE.getMessage());
        }
    }

    @Override
    public UsuarioDTO consultaUsuarioPorNif(String nif) throws RemoteException, GestorMantenimientoException {

        UsuarioDTO usuario = new UsuarioDTO();

        try {
            DAOFactory factory = DAOFactory.getDAOFactory();
            IUsuarioDAO dao = factory.getUsuarioDAO();
            usuario = dao.consultaUsuarioPorNif(nif);

            // Liberamos recursos
            factory = null;
            dao = null;

        } catch (DAOFactoryException daoFe) {
            throw new GestorMantenimientoException(GestorMantenimientoException.ERROR_CONSULTA_USUARIO
                    + Constantes.SL + daoFe.getMessage());
        } catch (DataBaseDAOException daoE) {
            throw new GestorMantenimientoException(GestorMantenimientoException.ERROR_CONSULTA_USUARIO
                    + Constantes.SL + daoE.getMessage());
        }
        return usuario;
    }

    @Override
    public UsuarioDTO consultaUsuarioPorNombre(String nombre, String apellidos) throws RemoteException, GestorMantenimientoException {

        UsuarioDTO usuario = new UsuarioDTO();

        try {
            DAOFactory factory = DAOFactory.getDAOFactory();
            IUsuarioDAO dao = factory.getUsuarioDAO();
            usuario = dao.consultaUsuarioPorNombre(nombre, apellidos);

            // Liberamos recursos
            factory = null;
            dao = null;

        } catch (DAOFactoryException daoFe) {
            throw new GestorMantenimientoException(GestorMantenimientoException.ERROR_CONSULTA_USUARIO
                    + Constantes.SL + daoFe.getMessage());
        } catch (DataBaseDAOException daoE) {
            throw new GestorMantenimientoException(GestorMantenimientoException.ERROR_CONSULTA_USUARIO
                    + Constantes.SL + daoE.getMessage());
        }
        return usuario;
    }

    /**
     * Inserta en el campo CC correspondiente a un usuario del tipo Cliente
     * los datos del número de cuenta corriente facilitados
     * @param idUsuario el identificador del usuario Cliente
     */
    @Override
    public void ccCliente(String cc, String idUsuario) throws RemoteException, GestorMantenimientoException {
        try {
            DAOFactory factory = DAOFactory.getDAOFactory();
            IUsuarioDAO dao = factory.getUsuarioDAO();
            dao.ccCliente(cc, idUsuario);

            // Liberamos recursos
            factory = null;
            dao = null;

        } catch (DAOFactoryException daoFe) {
            throw new GestorMantenimientoException(GestorMantenimientoException.ERROR_ALTA_CC
                    + Constantes.SL + daoFe.getMessage());
        } catch (DataBaseDAOException daoE) {
            throw new GestorMantenimientoException(GestorMantenimientoException.ERROR_ALTA_CC
                    + Constantes.SL + daoE.getMessage());
        }
    }

    /**
     * Inserta los roles asignados a un usuario en la base de datos
     * @param idUsuario El identificador del usuario
     * @param idRol El identificador del rol asignado
     */
    @Override
    public void usuarioRol(String idUsuario, int idRol) throws RemoteException, GestorMantenimientoException {
        try {
            DAOFactory factory = DAOFactory.getDAOFactory();
            IUsuarioDAO dao = factory.getUsuarioDAO();
            dao.usuarioRol(idUsuario, idRol);

            // Liberamos recursos
            factory = null;
            dao = null;

        } catch (DAOFactoryException daoFe) {
            throw new GestorMantenimientoException(GestorMantenimientoException.ERROR_ALTA_USUARIO_ROL
                    + Constantes.SL + daoFe.getMessage());
        } catch (DataBaseDAOException daoE) {
            throw new GestorMantenimientoException(GestorMantenimientoException.ERROR_ALTA_USUARIO_ROL
                    + Constantes.SL + daoE.getMessage());
        }
    }

    /**
     * Inserta los roles asignados a un usuario en la base de datos
     * @param idUsuario El identificador del usuario
     * @param idRol El identificador del rol asignado
     */
    @Override
    public void bajaRol(String idUsuario, int idRol) throws RemoteException, GestorMantenimientoException {
        try {
            DAOFactory factory = DAOFactory.getDAOFactory();
            IUsuarioDAO dao = factory.getUsuarioDAO();
            dao.bajaRol(idUsuario, idRol);

            // Liberamos recursos
            factory = null;
            dao = null;

        } catch (DAOFactoryException daoFe) {
            throw new GestorMantenimientoException(GestorMantenimientoException.ERROR_BAJA_USUARIO_ROL
                    + Constantes.SL + daoFe.getMessage());
        } catch (DataBaseDAOException daoE) {
            throw new GestorMantenimientoException(GestorMantenimientoException.ERROR_BAJA_USUARIO_ROL
                    + Constantes.SL + daoE.getMessage());
        }
    }

    /**
     * Realiza la asignación de una lista de características físicas a un aula
     * @param listaCFisicas es la lista de características físicas a asignar
     * @param idAula El identificador del aula 
     * @throws  RemoteException
     * @throws  GestorMantenimientoException
     */
    @Override
    public void cFisicaToAula(List<CFisicaDTO> listaCFisicas, int idAula) throws RemoteException, GestorMantenimientoException {
        try {
            DAOFactory factory = DAOFactory.getDAOFactory();
            IAulaDAO dao = factory.getAulaDAO();
            dao.cFisicaToAula(listaCFisicas, idAula);
            
            // Liberamos recursos
            factory = null;
            dao = null;

        } catch (DAOFactoryException daoFe) {
            throw new GestorMantenimientoException(GestorMantenimientoException.ERROR_CFISICA_AULA
                    + Constantes.SL + daoFe.getMessage());
        } catch (DataBaseDAOException daoE) {
            throw new GestorMantenimientoException(GestorMantenimientoException.ERROR_CFISICA_AULA
                    + Constantes.SL + daoE.getMessage());
        }
    }

    /**
     * Obtiene  la lista de características físicas existentes en la base de datos
     * @return  cFisicas La lista de las características físicas existentes en la
     *          base de datos
     * @throws  RemoteException
     * @throws  GestorMantenimientoException
     */
    @Override
    public List<CFisicaDTO> cFisicasAula() throws RemoteException, GestorMantenimientoException {

        List<CFisicaDTO> cfDisponibles = new ArrayList<CFisicaDTO>();

        try {
            DAOFactory factory = DAOFactory.getDAOFactory();
            IAulaDAO dao = factory.getAulaDAO();
            cfDisponibles = dao.cFisicasAula();
            // Liberamos recursos
            factory = null;
            dao = null;

        } catch (DAOFactoryException daoFe) {
            throw new GestorMantenimientoException(GestorMantenimientoException.ERROR_CFISICA_AULA
                    + Constantes.SL + daoFe.getMessage());
        } catch (DataBaseDAOException daoE) {
            throw new GestorMantenimientoException(GestorMantenimientoException.ERROR_CFISICA_AULA
                    + Constantes.SL + daoE.getMessage());
        }
        return cfDisponibles;
    }

    /**
     * Obtiene la lista de características físicas del aula
     * @param idAula El identificador del aula
     * @return lcFisicas La lista de las características físicas existentes en el aula
     */
    public List<CFisicaDTO> cFisicasFromAula(int idAula) throws RemoteException, GestorMantenimientoException {
        
        List<CFisicaDTO> cfAula = new ArrayList<CFisicaDTO>();
        
        try {
            DAOFactory factory = DAOFactory.getDAOFactory();
            IAulaDAO dao = factory.getAulaDAO();
            cfAula = dao.cFisicasFromAula(idAula);
            // Liberamos recursos
            factory = null;
            dao = null;

        } catch (DAOFactoryException daoFe) {
            throw new GestorMantenimientoException(GestorMantenimientoException.ERROR_CFISICA_AULA
                    + Constantes.SL + daoFe.getMessage());
        } catch (DataBaseDAOException daoE) {
            throw new GestorMantenimientoException(GestorMantenimientoException.ERROR_CFISICA_AULA
                    + Constantes.SL + daoE.getMessage());
        }
        return cfAula;
    } 
}